/**
* 
*/
package com.naiterui.ehp.bs.doctor.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.naiterui.ehp.bp.utils.lang.ConfigUtil;
import com.naiterui.ehp.bp.utils.notice.SendMessageUtil;
import com.naiterui.ehp.bp.utils.thread.ThreadPoolUtil;

/**
 * @Description 概述
 */
public class SMSUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(SMSUtil.class);
    private static String url = ConfigUtil.getString("api.sms.singlesned.url");
    private static SendMessageUtil sendMessageUtil = new SendMessageUtil(url);

    public enum Template {
        /** 注册 */
        REG (ConfigUtil.getString("message_reg_tmplate")),
        /** 密码找回 */
        PWD (ConfigUtil.getString("message_pwd_tmplate")),
        /** 3天未登陆提醒 */
        DR_NOT_LOGIN (ConfigUtil.getString("send.unlogin.msg")),
        /** 购药咨询提醒文案 */
        REQUIER_REMIND_FIRST_TEMPLATE (ConfigUtil.getString("doctor.require.remind.msg.first.templateid")),
        /** 购药咨询第二次提醒文案 */
        REQUIER_REMIND_SECOND_TEMPLATE (ConfigUtil.getString("doctor.require.remind.msg.second.templateid")),
        /** 医生积分增加 */
        DR_POINT_ADD (ConfigUtil.getString("message_dr_pointAdd_tmplate")),
        /** 步长医生积分增加-非步长医生短信文案 */
        IS_NOT_BC_DR_POINT_ADD (ConfigUtil.getString("message_is_not_bc_dr_pointAdd_tmplate")),
        /** 疗效反馈-推荐购药 */
        DR_MEDIC_VISIT_RECOM_POINT_ADD (ConfigUtil.getString("message_dr_medic_visit_recom_pointAdd_tmplate")),
        /** 疗效反馈-主动购药 */
        DR_MEDIC_VISIT_ACTIVE_POINT_ADD (ConfigUtil.getString("message_dr_medic_visit_active_pointAdd_tmplate")),
        /** 首次登陆医生，72小时未提交认证提醒 */
        DR_OVER_DUE_AUDIT (ConfigUtil.getString("message.dr.audit.remind.template")),
        /** 医生拒绝发送短信模板 */
        DR_REJECT_VIDEO (ConfigUtil.getString("reservation.sms.template")),
        /** 系统取消订单模板 */
        SYSTEM_CANCEL_SMS (ConfigUtil.getString("reservation.system.cancel.sms.template")),
        /*医生超时未发起的预约订单详情*/
        SYSTEM_CANCEL_SMS_PATIENT_TIMEOUT (ConfigUtil.getString("reservation.system.cancel.patient.timeout.templateid")),
        /*患者超时未接通的预约订单详情*/
        SYSTEM_CANCEL_SMS_PATIENT_NOANSWER (ConfigUtil.getString("reservation.system.cancel.patient.noanswer.templateid")),
        /*医生订单完成发送短信*/
        DR_POINT_VIDEO (ConfigUtil.getString("reservation.video.service.point.template")),
        /** 预约时间到点提醒医生 */
        DR_REMIND (ConfigUtil.getString("reservation.sms.remind.templateid")),
        /** 医生备案通过 **/
        RECORD_SUCCESS (ConfigUtil.getString("record.success.sms.template")),
        /** 医生备案失败 **/
        RECORD_FAIL (ConfigUtil.getString("record.fail.sms.template")),
        /** 要求医生备案 **/
        RECORD_REQUIRED (ConfigUtil.getString("record.required.sms.template")),
        /** 30天未购发送微信失败发送短信 */
        PATIENT_RE_PURCHASE_TEMPLATE (ConfigUtil.getString("patient_re_purchase")),

        RECORD_NO (ConfigUtil.getString("record.no.sms.template")),

        /** 非阳光化医生，0积分短信文案 */
        DR_NO_POINT_ADD_TEMPLATE (ConfigUtil.getString("doctor.no.point.add.template")),
        
        /** 阳光化病例数据收集短信文案 */
        DR_PUBLIC_POINT_ADD_COLLECT_TEMPLATE (ConfigUtil.getString("doctor.public.point.collect.template")),

        /** 用户流失问卷调查，短信文案 */
        QUESTIONNAIRE_USER_TEMPLATE (ConfigUtil.getString("questionnaire.user.template")),

        /** 医生审核通过短信文案 */
        AUDIT_PASS_TEMPLATE (ConfigUtil.getString("audit.success.msg.template")),

        /** 医生认证失败短信文案 */
        AUDIT_FAIL_TEMPLATE (ConfigUtil.getString("audit.fail.msg.template")),

        /** 医生备案结果通过短信文案 */
        RECORD_PASS_TEMPLATE (ConfigUtil.getString("record.result.success.msg.template")),

        /** 短信通知有待审核医生需要处理 */
        SEND_AUDIT_DOCTOR_NOTICE_TEMPLATE (ConfigUtil.getString("send.audit.doctor.notice.template")),

        /** H5页注册后通知医生注册成功 */
        DOCTOR_REGIS_H5_SUCCESS_TEMPLATE (ConfigUtil.getString("doctor.regist.h5.sms.template"));



        private String templateId;

        Template(String templateId) {
            this.templateId = templateId;
        }

        public String getTemplateId() {
            return this.templateId;
        }

        public void setTemplateId(String templateId) {
            this.templateId = templateId;
        }
    }

    /**
     * <根据模板发送短信>
     * @param phone
     * @param tmpl
     * @param args void <返回值描述>
     * @Throws 异常信息
     * @History 2015-8-21 下午2:30:02 by guoyongxiang
     */
    public static void sendSMS(String phone, Template tmpl, Object... args) {
        String templateId = tmpl.getTemplateId();
        LOGGER.info("[smsSend]短信发送phone: {}, templateId: {}, params: {}", phone, templateId, args);
        try {
            sendMessageUtil.sendSms(phone, templateId, args);
        } catch (Exception e) {
            LOGGER.warn("[smsSend]短信模板内容为空phone: {}, templateId: {}, params: {}", phone, templateId, args, e);
        }
    }

    /**
     * 异步短信发送方法
     * SMSUtil.asyncSendSMS()

     * @Date 2017年10月31日
     * @since 2.9.2
     * @param phone
     * @param tmpl
     * @param args
     */
    public static void asyncSendSMS(final String phone, final Template tmpl, final Object... args) {
        ThreadPoolUtil.execute(() -> SMSUtil.sendSMS(phone, tmpl, args));
    }
}
